from sqlalchemy import Column, Integer, String, Text, Boolean, DateTime, ForeignKey, UniqueConstraint
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from api.database import Base

class Email(Base):
    """
    邮件模型
    """
    __tablename__ = "emails"
    
    # 主键和账户关联
    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    email_account_id = Column(Integer, ForeignKey("email_accounts.id"), nullable=False)
    
    # 全局唯一标识（v2.0：基于Message-ID，不包含folder信息）
    message_id = Column(String(255), nullable=True, index=True)  # 邮件消息ID（全局唯一）
    email_hash = Column(String(64), nullable=True, index=True)  # 基于(sender,recipients,subject,date)的哈希
    is_generated_message_id = Column(Boolean, default=False)  # 标记Message-ID是否由系统生成
    # 邮件基本信息
    subject = Column(Text, nullable=False)  # 邮件主题可能很长，使用Text。移除 default="无主题" 因为是 TEXT 类型
    sender = Column(String(255), nullable=False)  # 发件人, String 长度明确
    recipients = Column(Text, nullable=False)  # 收件人（可能多个），使用Text。移除 default="" 因为是 TEXT 类型
    cc = Column(Text, nullable=True)  # 抄送（可能多个），使用Text。移除 default="" 因为是 TEXT 类型
    bcc = Column(Text, nullable=True)  # 密送（可能多个），使用Text。移除 default="" 因为是 TEXT 类型
    # 邮件内容
    summary = Column(String(255), nullable=True)  # 邮件摘要
    has_attachments = Column(Boolean, default=False)
    
    # 邮件元数据
    size = Column(Integer, nullable=True)  # 邮件大小（字节）
    received_date = Column(DateTime(timezone=True), nullable=False)  # 接收时间
    sent_date = Column(DateTime(timezone=True), nullable=True)  # 发送时间
    # 邮件状态
    # 全局状态
    is_read = Column(Boolean, default=False)
    is_starred = Column(Boolean, default=False)  # 星标状态
    is_deleted = Column(Boolean, default=False)
    
    # 存储路径
    eml_path = Column(String(500), nullable=True)  # EML文件存储路径
    
    # 时间戳
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
    
    # 关系定义（v2.0：使用EmailFolder关联表）
    account = relationship("EmailAccount", back_populates="emails")
    folders = relationship("EmailFolder", back_populates="email", cascade="all, delete-orphan")
